#-*- coding: utf-8 -*-
#
u"""
O trabalho destina-se a realizar uma aplicação com interface gráfica para o utilizador que processe
e apresente estatísticas de acerca da evolução dos salários da função pública em Portugal.
Estas estatísticas são:
• o índice de preços ao consumidor (IPC);
• a taxa de inflação;
• a remuneração mínima mensal dos funcionários públicos;
• a remuneração máxima mensal dos funcionários públicos;
• a evolução das remunerações máximas e mínimas mensais dos funcionários públicos a preços
constantes;
• o produto interno bruto anual (PIB) per capita;
• o rendimento nacional anual bruto per capita;
• o rendimento disponível anual bruto per capita;
• as remunerações per capita anuais.
Os gráficos devem permitir a análise mais fácil das estatísticas.
Os alunos têm como fonte de dados principal o ficheiro em formato Excel na página da disciplina,
designado por IPC_PORTUGAL_1977_2013.xls
"""
#
# modulo de operações de leitura e escrita sobre um ficheiro
# de base de dados sqlite3
# 
# IPBeja - Escola Superior de Tecnologia e Getão
# Engenharia Informática
# Elísio Gonçalves Ribeiro nº4708


##
###############################################################################

import string, datetime
import xlrd
import op_db as DB                                                #retirado de http://pypi.python.org/pypi/Unidecode


##
###############################################################################
# metodo que verifica o nm_ficheiro fornecido tem a extenção correcta
# tenta abrir o nm_ficheiro e guarda uma ligacao do ficheiro aberto
#
#******************************************************************************
#******************************************************************************
#
def load_tables_info(config_file):
    """
    """
    file1 = open(config_file, 'r')
    table_info = {}
    for line in file1.readlines():
        if line[0] == '#': 
            line = line[1:].split()
            t_name = line[0].strip()
            start_nrs = (int(line[1].strip()), int(line[2].strip()))
            table_info[t_name] = ([], start_nrs)
        else:
            table_info[t_name][0].append(line.strip())
    file1.close()
    return table_info
##por aqui un try catch q se ficheiro der erro raise else verifica se tabela existe raise else return
#
#
def create_tables(db_name, tables_info):
    """
    use the content of table_info to create tables
    in the given DB file on db_name
    """
    try:
        conn = DB.connectingTo_db(db_name)                                         #ligacao a base de dados
        if (conn != None):
            cursor = conn.cursor()                                                #criacao do cursor
            for t_name,attrib in tables_info.items():
                DB.creating_table(cursor, t_name, attrib[0])
    except:
        raise
    else:
        DB.turnOff_conn(conn, cursor)                                          #tudo lido e gurdado entao desligar
        
        return db_name
    
#
#
#
def read_excelDatato_DB(excel_file, db_file, table_info):
    """
    """
    try:
        excel_book = xlrd.open_workbook(excel_file, formatting_info=True)      #tenta abrir o documento para leitura
    except:
        raise
    else:
        try:
            conn = DB.connectingTo_db(db_file)                                         #ligacao a base de dados
            if (conn != None):
                cursor = conn.cursor()
                
        #para identificar cada tabela a cada para chave,valor no dict define se que 
        #os nomes das tabelas no ficheiro tables.txt sejam os mesmos que o das folhas no ficheiro excel
        #assim podem ser referenciadas, as folhas pelo nome
                table_data = dict.fromkeys(table_info.keys())
                for t_name,extra_info in table_info.items():
            
                    t_colums = extra_info[0]
                    start_nrs = extra_info[1]
                    
                    excel_leaf = excel_book.sheet_by_name(t_name)
                    data = read_leafData(excel_leaf, start_nrs)
                    DB.filling_dbTable(cursor, data, t_name)
                conn.commit()
        except:
            raise
#
#
#
def read_leafData(excel_leaf, start_nrs):
    row_nr = start_nrs[0]
    end_col = start_nrs[1]
    data = []
    def repl_val(x1):
        if x1 == '': x1 = 0.0
        return x1
        
    
    for row in range(row_nr, excel_leaf.nrows):
        if excel_leaf.cell_type(row,0) == xlrd.XL_CELL_DATE:
            value = xlrd.xldate_as_tuple(excel_leaf.cell_value(row, 0), xlrd.Book.datemode)
            row_data = excel_leaf.row_values(row, end_colx=end_col)
            row_data[0] = datetime.datetime(*value)
        else:
            row_data = excel_leaf.row_values(row, end_colx=end_col)
        if len(filter(lambda x: x!='', row_data)) == 0: break
        if row_data[0] == '': row_data = row_data[1:]
        row_data = map(repl_val, row_data)
        
        data.append(tuple(row_data))
    return data

#
#codificando os dados fornecidos com unicode
#
def __unidecoding(list):
    """converte os valores passados na lista para unicode
        list   - conjunto de dados a converter
    """
    tmp_lst = []
    for cmp in list:
        cmp = cmp.split()
        if len(cmp) > 2:
            tmp = cmp[1:len(cmp)-1]
            cmp = [cmp[0], cmp[-1]]
            [cmp.insert(-1,tmp[k][:3]) for k in range(len(tmp))]
        tmp_lst.append(string.joinfields(cmp, '_').encode('utf-8'))
    pass
    return tmp_lst


#******************************************************************************
#******************************************************************************

###############################################################################
